home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / applic / ncsa / Mac / Telnet2.6 / prerelease / d4 / Telnet2.6.1d4.src.sit.hqx / Telnet 2.6.1d4 source / source / config / prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-09  |  12.9 KB  |  393 lines

  1. /****************************************************************
  2. *    NCSA Telnet for the Macintosh                                *
  3. *                                                                *
  4. *    National Center for Supercomputing Applications                *
  5. *    Software Development Group                                    *
  6. *    152 Computing Applications Building                            *
  7. *    605 E. Springfield Ave.                                        *
  8. *    Champaign, IL  61820                                        *
  9. *                                                                *
  10. *    Copyright (c) 1993,                                            *
  11. *    Board of Trustees of the University of Illinois                *
  12. *****************************************************************
  13. *    Revisions:
  14. *    5/93    Telnet 2.6:    Rewritten entirely -- Jim Browne
  15. */
  16.  
  17. #ifdef MPW
  18. #pragma segment Configure
  19. #endif
  20.  
  21. #include "TelnetHeader.h"
  22. #include "debug.h"
  23. #include "telneterrors.h"
  24. #include "prefs.proto.h"
  25. #include "mainseg.proto.h"        // For quit proto
  26.  
  27. FTPServerPrefs*        gFTPServerPrefs=NULL;
  28. ApplicationPrefs*    gApplicationPrefs=NULL;
  29.  
  30. OSErr OpenPreferencesFile( void)
  31. {
  32.     Str255    **PreferencesFileNameHdl;
  33.     OSErr     err;
  34.     
  35.     PreferencesFileNameHdl = (Str255**)GetString(PREFERENCES_FILE_NAME_STR_ID);
  36.     if (PreferencesFileNameHdl == NULL) {
  37.         DebugStr("\pSomeone has deleted the prefs file name resource!");
  38.         forcequit();
  39.         }
  40.     
  41.     HLock((Handle)PreferencesFileNameHdl);
  42.         
  43.     /* look for an existing settings file. */
  44.     /* first, try the application folder */
  45.     TelInfo->SettingsFile=HOpenResFile(TelInfo->ApFolder.vRefNum, TelInfo->ApFolder.parID,
  46.                                             (StringPtr)*PreferencesFileNameHdl,fsRdWrShPerm);
  47.  
  48.     if (TelInfo->SettingsFile == -1) /* Look in System Folder */
  49.         {
  50.         TelInfo->SettingsFile = HOpenResFile(TelInfo->SysFolder.vRefNum, 
  51.                                                 TelInfo->SysFolder.parID, 
  52.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  53.         }
  54.  
  55.     if (TelInfo->SettingsFile == -1) /* Look in Preferences Folder */
  56.         {
  57.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  58.                                                 TelInfo->PrefFolder.parID,
  59.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  60.         }
  61.  
  62.     if (TelInfo->SettingsFile == -1)
  63.           {
  64.         if ((err = HCreate(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  65.                         (StringPtr)*PreferencesFileNameHdl, 'NCSA', 'pref')) != noErr)
  66.             FatalAlert(CANT_CREATE_PREFS, 120, err);
  67.  
  68.         HCreateResFile(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  69.                     (StringPtr)*PreferencesFileNameHdl);
  70.  
  71.         if (ResError() != noErr)
  72.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());
  73.  
  74.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  75.                                                 TelInfo->PrefFolder.parID,
  76.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  77.  
  78.         if (TelInfo->SettingsFile == -1)
  79.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());        // Give up
  80.             
  81.         if ((err = NewPreferences()) != noErr) return(err);
  82.           }
  83.         
  84.     UseResFile(TelInfo->SettingsFile);
  85.     ReleaseResource((Handle)PreferencesFileNameHdl);
  86.  
  87.     return    noErr;
  88. }
  89.  
  90. OSErr NewPreferences(void)
  91. {
  92.     ApplicationPrefs    **AppPrefsHdl;
  93.     FTPServerPrefs        **FTPPrefsHdl;
  94.     SessionPrefs        **DefaultSessionPrefs;
  95.     TerminalPrefs        **DefaultTerminalPrefs;
  96.         
  97.     // Get the master copies from the application's resource fork
  98.     
  99.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_APPID);
  100.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  101.     DetachResource((Handle)AppPrefsHdl);
  102.     
  103.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_APPID);
  104.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  105.     DetachResource((Handle)FTPPrefsHdl);
  106.  
  107.     DefaultSessionPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
  108.     if ((ResError() != noErr) || (DefaultSessionPrefs == NULL)) return(ResError());
  109.     DetachResource((Handle)DefaultSessionPrefs);
  110.     
  111.     DefaultTerminalPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
  112.     if ((ResError() != noErr) || (DefaultTerminalPrefs == NULL)) return(ResError());
  113.     DetachResource((Handle)DefaultTerminalPrefs);
  114.  
  115.     // Add them to the Preferences file
  116.     
  117.     UseResFile(TelInfo->SettingsFile);
  118.     if (ResError() != noErr) return(ResError());
  119.     AddResource((Handle)AppPrefsHdl, APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID, "\p");
  120.     if (ResError() != noErr) return(ResError());
  121.     AddResource((Handle)FTPPrefsHdl,FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID, "\p");
  122.     if (ResError() != noErr) return(ResError());
  123.     AddResource((Handle)DefaultSessionPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
  124.     if (ResError() != noErr) return(ResError());
  125.     AddResource((Handle)DefaultTerminalPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
  126.     if (ResError() != noErr) return(ResError());
  127.  
  128.     // Update the preferences file and release the resources
  129.     
  130.     UpdateResFile(TelInfo->SettingsFile);
  131.     ReleaseResource((Handle)AppPrefsHdl);
  132.     ReleaseResource((Handle)FTPPrefsHdl);
  133.     ReleaseResource((Handle)DefaultSessionPrefs);
  134.     ReleaseResource((Handle)DefaultTerminalPrefs);
  135.     return(ResError());
  136. }
  137.  
  138. OSErr LoadPreferences(void)
  139. {
  140.     ApplicationPrefs    **AppPrefsHdl;
  141.     FTPServerPrefs        **FTPPrefsHdl;
  142.     
  143.     UseResFile(TelInfo->SettingsFile);
  144.     if (ResError() != noErr) return(ResError());
  145.     
  146.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  147.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  148.  
  149.     HLock((Handle) AppPrefsHdl);
  150.     BlockMove(*AppPrefsHdl, gApplicationPrefs, sizeof(ApplicationPrefs));
  151.     ReleaseResource((Handle) AppPrefsHdl);
  152.     
  153.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  154.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  155.  
  156.     HLock((Handle) FTPPrefsHdl);
  157.     BlockMove(*FTPPrefsHdl, gFTPServerPrefs, sizeof(FTPServerPrefs));
  158.     ReleaseResource((Handle) FTPPrefsHdl);
  159.     
  160.     return(noErr);
  161. }
  162.  
  163. OSErr SavePreferences(void)
  164. {
  165.     ApplicationPrefs    **AppPrefsHdl;
  166.     FTPServerPrefs        **FTPPrefsHdl;
  167.     Boolean                UserHasBeenAlerted = FALSE, UserResponse;
  168.     
  169.     UseResFile(TelInfo->SettingsFile);
  170.     if (ResError() != noErr) return(ResError());
  171.     
  172.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  173.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  174.  
  175.     HLock((Handle) AppPrefsHdl);
  176.     if (gApplicationPrefs->version < (*AppPrefsHdl)->version) {
  177.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  178.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  179.         UserHasBeenAlerted = TRUE;                    // Don't ask the user twice!
  180.         }
  181.         
  182.     BlockMove(gApplicationPrefs, *AppPrefsHdl, sizeof(ApplicationPrefs));
  183.     ChangedResource((Handle) AppPrefsHdl);
  184.     
  185.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  186.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  187.  
  188.     HLock((Handle) FTPPrefsHdl);
  189.     if ((gFTPServerPrefs->version < (*FTPPrefsHdl)->version) && (!UserHasBeenAlerted)) {
  190.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  191.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  192.         }
  193.                 
  194.     BlockMove(gFTPServerPrefs, *FTPPrefsHdl, sizeof(FTPServerPrefs));
  195.     ChangedResource((Handle) FTPPrefsHdl);
  196.  
  197.     UpdateResFile(TelInfo->SettingsFile);
  198.     ReleaseResource((Handle) AppPrefsHdl);
  199.     ReleaseResource((Handle) FTPPrefsHdl);
  200.     return(noErr);
  201. }
  202.  
  203. TerminalPrefs    **GetDefaultTerminal(void)
  204. {
  205.     TerminalPrefs    **theTerminalHdl;
  206.     short            scratchshort;
  207.     
  208.     UseResFile(TelInfo->SettingsFile);
  209.     theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  210.     
  211.     // If there is an error here, we put up a dialog box about the prefs
  212.     // being messed up and then we restore the default from the master copy
  213.     // in the application's resource fork.
  214.     
  215.     if (theTerminalHdl == NULL) {
  216.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 110, ResError());
  217.         UseResFile(TelInfo->ApplicationFile);
  218.         theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  219.         
  220.         // If the master copy is not there, it's a fatal error!
  221.         if (theTerminalHdl == NULL)
  222.             FatalAlert(RESOURCE_PROBLEM, 111, ResError());    // Doesn't return
  223.         
  224.         DetachResource((Handle)theTerminalHdl);    
  225.         UseResFile(TelInfo->SettingsFile);
  226.         scratchshort = Unique1ID(TERMINALPREFS_RESTYPE);
  227.         AddResource((Handle)theTerminalHdl, TERMINALPREFS_RESTYPE, scratchshort, "\p<Default>");
  228.  
  229.         // If an error ocurred fixing the prefs file, it's a fatal error!
  230.         if (ResError() != noErr) 
  231.             FatalAlert(NUKED_PREFS, 112, ResError());    // Doesn't return
  232.             
  233.         UpdateResFile(TelInfo->SettingsFile);
  234.         }
  235.         
  236.     DetachResource((Handle)theTerminalHdl);
  237.     return(theTerminalHdl);
  238. }
  239.  
  240. SessionPrefs    **GetDefaultSession(void)
  241. {
  242.     SessionPrefs    **theSessionHdl;
  243.     short            scratchshort;
  244.     
  245.     UseResFile(TelInfo->SettingsFile);
  246.     theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  247.  
  248.     // If there is an error here, we put up a dialog box about the prefs
  249.     // being messed up and then we restore the default from the master copy
  250.     // in the application's resource fork.
  251.     
  252.     if (theSessionHdl == NULL) {
  253.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 100, ResError());
  254.         UseResFile(TelInfo->ApplicationFile);
  255.         theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  256.         
  257.         // If the master copy is not there, it's a fatal error!
  258.         if (theSessionHdl == NULL)
  259.             FatalAlert(RESOURCE_PROBLEM, 101, ResError());    // Doesn't return
  260.             
  261.         DetachResource((Handle)theSessionHdl);
  262.         UseResFile(TelInfo->SettingsFile);
  263.         scratchshort = Unique1ID(SESSIONPREFS_RESTYPE);
  264.         AddResource((Handle)theSessionHdl, SESSIONPREFS_RESTYPE, scratchshort, "\p<Default>");
  265.  
  266.         // If an error ocurred fixing the prefs file, it's a fatal error!
  267.         if (ResError() != noErr) 
  268.             FatalAlert(NUKED_PREFS, 102, ResError());    // Doesn't return
  269.             
  270.         UpdateResFile(TelInfo->SettingsFile);
  271.         }
  272.         
  273.     DetachResource((Handle)theSessionHdl);
  274.     return(theSessionHdl);
  275. }
  276.  
  277. void    GetHostNameFromSession(StringPtr string)
  278. {
  279.     SessionPrefs    **sessHdl;
  280.     
  281.     UseResFile(TelInfo->SettingsFile);
  282.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, string);
  283.     HLock((Handle)sessHdl);
  284.     
  285.     BlockMove((**sessHdl).hostname, string, Length((**sessHdl).hostname)+1);
  286.     
  287.     ReleaseResource((Handle)sessHdl);
  288. }
  289.  
  290. //    We recognize the following input string: "xxxx yyyy"
  291. //    If "xxxx" matches a session name, that session record is used.  Otherwise, the default
  292. //    session record is used with "xxxx" as the DNS hostname.   "yyyy", if extant, is
  293. //    converted to a number.  If it is a valid number, it is used as the port to connect to.
  294. //    WARNING: Do not pass this routing a blank string.  (We check this in PresentOpenConnectionDialog.)
  295. ConnInitParams    **NameToConnInitParams(StringPtr InputString)
  296. {
  297.     ConnInitParams    **theHdl;
  298.     SessionPrefs    **sessHdl;
  299.     TerminalPrefs    **termHdl;
  300.     short            portRequested;
  301.     Boolean            foundPort;
  302.     
  303.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  304.     
  305.     foundPort = ProcessHostnameString(InputString, &portRequested);        
  306.         
  307.     UseResFile(TelInfo->SettingsFile);
  308.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, InputString);
  309.     if (sessHdl == NULL) {                // Connect to host xxxx w/default session.
  310.         sessHdl = GetDefaultSession();
  311.         DetachResource((Handle) sessHdl);
  312.         HLock((Handle)sessHdl);
  313.         BlockMove(InputString, (**sessHdl).hostname, 64);
  314.         }
  315.     else {    
  316.         DetachResource((Handle) sessHdl);
  317.         HLock((Handle)sessHdl);
  318.         }
  319.  
  320.     (**theHdl).session = sessHdl;
  321.     
  322.     UseResFile(TelInfo->SettingsFile);
  323.     termHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, (**sessHdl).TerminalEmulation);
  324.     if (termHdl == NULL) termHdl = GetDefaultTerminal();
  325.     DetachResource((Handle) termHdl);
  326.     (**theHdl).terminal = termHdl;
  327.     HUnlock((Handle)sessHdl);
  328.     
  329.     ((**theHdl).WindowName)[0] = 0;
  330.     (**sessHdl).ip_address = 0;
  331.     
  332.     if (foundPort) (**sessHdl).port = portRequested;
  333.     
  334.     return(theHdl);
  335. }
  336.  
  337. ConnInitParams    **ReturnDefaultConnInitParams(void)
  338. {
  339.     ConnInitParams    **theHdl;
  340.  
  341.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  342.  
  343.     (**theHdl).session = GetDefaultSession();
  344.     (**(**theHdl).session).ip_address = 0;
  345.     (**theHdl).terminal = GetDefaultTerminal();
  346.     
  347.     return(theHdl);
  348. }
  349.  
  350. Boolean            ProcessHostnameString(StringPtr    HostnameString, short *port)
  351. {
  352.     Str255            MungeString;
  353.     short            scratchshort;
  354.     long            portRequested;
  355.     StringPtr        xxxxptr, yyyyptr;
  356.     Boolean            foundPort = FALSE;
  357.     
  358.     //    Copy the whole damn thing over
  359.     BlockMove(HostnameString, MungeString, 255);
  360.     
  361.     //    Remove leading spaces
  362.     scratchshort = 1;
  363.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] == ' '))
  364.         scratchshort++;
  365.     
  366.     if (scratchshort > Length(MungeString)) {
  367.         HostnameString[0] = 0;
  368.         return(FALSE);
  369.         }
  370.  
  371.     xxxxptr = &MungeString[scratchshort-1];
  372.     
  373.     //    Now look for a port number...
  374.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] != ' '))
  375.         scratchshort++;
  376.     
  377.     yyyyptr = &MungeString[scratchshort];
  378.     
  379.     if (scratchshort < Length(MungeString)) {
  380.         MungeString[scratchshort] = Length(MungeString) - scratchshort;
  381.         StringToNum(&MungeString[scratchshort], &portRequested);
  382.         if ((portRequested > 0) && (portRequested < 65535))    foundPort = TRUE;
  383.         }
  384.     
  385.     xxxxptr[0] = yyyyptr - xxxxptr - 1;
  386.  
  387.     //    Copy parsed hostname string back
  388.     BlockMove(xxxxptr, HostnameString, Length(xxxxptr)+1);
  389.     
  390.     *port = (short)portRequested;
  391.     
  392.     return(foundPort);
  393. }